5.4 本地 Contiki 的 Ubidots IPv6 示例

本示例将演示 Contiki Ubidots 库的基本功能:

  • 如何使用库 post 到一个变量。
  • 如何使用库 post 到一个集合。
  • 如何获取 HTTP (部分)响应。

目前,Ubidots 的示例已经合并到 Contiki 的源码中,您也可以在 George Oikonomou 的仓库中找到一些函数示例。

George Oikonomou 完成了 Contiki 中的 Ubidots 库的编写。

Ubidots 示例位于examples/ipv6/ubidots

Ubidots 应用程序位于apps/ubidots

Ubidots 应用程序使用 TCP 套接字连接到主机things.ubidots.com。主机的 IPv4 和 IPv6 端点配置如下:

5.4 本地 Contiki 的 Ubidots IPv6 示例 - 图1

图 5.4. Ubidots 端点IPv4/IPv6 地址

为了检查程序运行状态,可在ubidots.c文件中使能调试打印,搜索#define DEBUG DEBUG_NONE,并替换为#define DEBUG DEBUG_PRINT

默认情况下, Ubidots 应用程序使用things.ubidots.com作为远程主机。不过,如果您没有解析主机地址的 NAT/NAT64 服务,可以明确地将 IPv6 远程主机定义为:

  1. #define UBIDOTS_CONF_REMOTE_HOST "2607:f0d0:2101:39::2"

如果您没有本地 IPv6 连接,可以使用 gogo6 或 hurricane electric 等提供的 IPv4toIPv6 隧道化服务,也可以使用 wrapsix 等提供的 NAT64 服务实现 IPv6 与 IPv4 的地址转换。

Ubidots 示例将每 30 秒 Post Z1 节点的运行时间和序列号,如前面章节一样,我们需要在 Ubidots 中创建两个变量。
创建数据源和变量,然后打开project-conf.h文件,并替换成以下内容:

  1. #define UBIDOTS_DEMO_CONF_UPTIME "XXXX"
  2. #define UBIDOTS_DEMO_CONF_SEQUENCE "XXXX"

最后一步关联固定的 Ubidots 短令牌,这样令牌过期后就不必再请求令牌。将令牌添加到Makefile

  1. DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
  2. CONTIKI_PROJECT = ubidots-demo
  3. APPS = ubidots
  4. UBIDOTS_WITH_AUTH_TOKEN=XXXXXXXX
  5. ifdef UBIDOTS_WITH_AUTH_TOKEN
  6. DEFINES+=UBIDOTS_CONF_AUTH_TOKEN=\"$(UBIDOTS_WITH_AUTH_TOKEN)\"
  7. endif
  8. all: $(CONTIKI_PROJECT)
  9. CONTIKI_WITH_IPV6 = 1
  10. CONTIKI = ../../..
  11. include $(CONTIKI)/Makefile.include

注意,UBIDOTS_WITH_AUTH_TOKEN没有使用引号 “” 。
现在基本完成了设置,下面开始编译和烧写 Z1 节点:

  1. make TARGET=z1 savetarget
  2. make clean && make ubidots-demo.upload && make z1-reset && make login

可以看到如下输出:

  1. connecting to /dev/ttyUSB0 (115200) [OK]
  2. Rime started with address 193.12.0.0.0.0.0.158
  3. MAC c1:0c:00:00:00:00:00:9e Ref ID: 158
  4. Contiki-d368451 started. Node id is set to 158.
  5. nullmac nullrdc, channel check rate 128 Hz, radio channel 26
  6. Tentative link-local IPv6 address fe80:0000:0000:0000:c30c:0000:0000:009e
  7. Starting 'Ubidots demo process'
  8. Ubidots client: STATE_ERROR_NO_NET
  9. Ubidots client: STATE_ERROR_NO_NET
  10. Ubidots client: STATE_ERROR_NO_NET
  11. Ubidots client: STATE_STARTING
  12. Ubidots client: Checking 64:ff9b::3217:7c44
  13. Ubidots client: 'Host: [64:ff9b::3217:7c44]' (remaining 44)
  14. Ubidots client: STATE_TCP_CONNECT (1)
  15. Ubidots client: STATE_TCP_CONNECTED
  16. Ubidots client: Prepare POST: Buffer at 199
  17. Ubidots client: Enqueue value: Buffer at 210
  18. Ubidots client: POST: Buffer at 211, content-length 13 (2), at 143
  19. Ubidots client: POST: Buffer at 208
  20. Ubidots client: STATE_POSTING (176)
  21. Ubidots client: STATE_POSTING (176)
  22. Ubidots client: STATE_POSTING (144)
  23. Ubidots client: STATE_POSTING (112)
  24. Ubidots client: STATE_POSTING (80)
  25. Ubidots client: STATE_POSTING (48)
  26. Ubidots client: STATE_POSTING (16)
  27. Ubidots client: STATE_POSTING (0)
  28. Ubidots client: HTTP Reply 200
  29. HTTP Status: 200
  30. Ubidots client: New header: <Server: nginx>
  31. Ubidots client: New header: <Date: Fri, 13 Mar 2015 09:35:08 GMT>
  32. Ubidots client: New header: <Content-Type: application/json>
  33. Ubidots client: New header: <Transfer-Encoding: chunked>
  34. Ubidots client: New header: <Connection: keep-alive>
  35. Ubidots client: New header: <Vary: Accept-Encoding>
  36. Ubidots client: Client wants header 'Vary'
  37. H: 'Vary: Accept-Encoding'
  38. Ubidots client: New header: <Vary: Accept>
  39. Ubidots client: Client wants header 'Vary'
  40. H: 'Vary: Accept'
  41. Ubidots client: New header: <Allow: GET, POST, HEAD, OPTIONS>
  42. Ubidots client: Chunk, len 22: <[{"status_code": 201}]> (counter = 22)
  43. Ubidots client: Chunk, len 0: <(End of Reply)> (Payload Length 22 bytes)
  44. P: '[{"status_code": 201}]'
5.4 本地 Contiki 的 Ubidots IPv6 示例 - 图2

图5.5 Ubidots 曲线图

上图使用曲线图和数值表显示相关变量。