虽然BLE 5.0协议理论上已经开始支持IPv6了,但是目前市面上还没有可用的实现IPv6通信的BLE产品。
最近在网上看到一个开源的基于contiki系统,在CC2650上实现的IPv6 over BLE——BLEach。官网
其实现原理类似于IPv6 over 6lowpan,在底层和应用层之间添加了中间层:

更多实现原理请查阅RFC 7668和BLEach开发者的论文BLEach Exploiting the Full Potential of IPv6 over BLE in Constrained Embedded IoT Device,本文不展开讨论。
本文根据BLEach的readme来实现一个简单IPv6 over BLE的UDP通信demo。

软硬件环境

  • 虚拟机:Instant Contiki
  • Contiki版本:3.0
  • server节点:淘宝买的CC2650开发板(电装科技)
  • client节点:TI CC2650 LaunchPad
  • Flash Programmer 2 版本:v1.7.5

安装Contiki

参见CC2650LaunchPad 运行contiki hello-world示例程序,稍有不同,这里源代码使用了带有BLEach的Contiki:https://github.com/spoerk/contiki

修改配置

server和client源代码分别在../contiki/examples/cc26xx/cc26xx-ble-server-demo../contiki/examples/cc26xx/cc26xx-ble-client-demo下,两个目录下的配置文件project-conf.h都已按照README.md配置好,另外需要修改两个部分:

server端

project-conf.h的line 62,这里定义了客户端的Mac地址,即客户端节点开机后主动链接的MAC地址。可能因为是demo,作者设为了固定值。

/* BLE radio settings */
#define BLE_MODE_CONF_INIT_PEER_ADDR      0x0000000000

所以我们需要看一下打算作为客户端的LaunchPad的MAC地址,通过Flash Programmer 2就可以,可能会出现需要擦除FLASH的提示:

这是因为怕从FLASH中提取出程序,所以加了锁,右上角选擦除就可以了:

然后从Mac Address标签下单击BLE Mac Address下的Read:

把读出的值写到上文提到的位置(按照格式)。

client端

client会一直广播,它不需要与固定mac地址的设备进行连接。需要修改的是client.c的line 50:

#define SERVER_IP             "fe80::xxxx:xxxx:xxxx:xxxx" //"::"

这里是UDP连接的server的IPv6地址,但是通过server源代码我们并不知道它的IPv6地址,后来才知道原来IPv6地址可以通过mac地址生成,所以知道server的mac地址,算出它的IPv6地址就可以了,有两种方法:

  • 同上文一样,通过Flash Programmer 2读出server的mac,然后根据算法算出其IPv6地址,也有现成的小工具,比如Compute MAC address to IPv6。
  • 将下文函数加到server.c中:

    static void
    print_local_addresses(void)
    {
      int i;
      uint8_t state;
      PRINTF("Server IPv6 addresses: ");
      for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
        state = uip_ds6_if.addr_list[i].state;
        if(uip_ds6_if.addr_list[i].isused &&
           (state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
          PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
          PRINTF("\n");
        }
      }
    }

    然后在PROCESS_THREAD(ipv6_ble_server_process, ev, data)中调用,然后编译下载后用串口助手看到打印出来的本机IPv6地址了。

编译和下载

根据板子不同,分别使用:
make TARGET=srf06-cc26xx BOARD=srf06/cc26xx server
make TARGET=srf06-cc26xx BOARD=launchpad/cc2650 client
编译后,在windows下用Flash Programmer 2下载。

效果

开机后,client自动开启广播,然后server与其建立BLE连接,通过IPv6邻居协议发现对方,通过UDP发送数据包:

客户端类似。

版权声明:本文为cola-fish原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cola-fish/p/8371539.html