近期CodeLab在IoT方向构建了一些工具。和大多数IoT项目相似,我们的工作也围绕MQTT协议展开。

CodeLab之后除了对外提供基础工具,也希望能对外提供基础服务。我们的工具链和服务都基于开源项目构建。

我们近期的工作包括:

  • Scratch IoT Extension
  • codelab-adapter iot extension
  • IoT server: iot.codelab.club

Scratch IoT Extension

Scratch IoT Extension允许接入所有支持wss的mqtt服务。Scratch IoT Extension基于MQTT.js构建。

在积木设计上,我们希望IoT积木尽量与EIM积木保持一致。原先想把publish替换为broadcast,后来还是决定保留mqtt用户习惯的词汇。 关于这一点,我们还没有想清楚,欢迎交流和吐槽。

Scratch IoT Extension是通用的。 你可以使用CodeLab提供的mqtt服务,也可以使用自建的mqtt服务(或第三方服务)来替代积木里默认的地址:wss://guest:test@iot.codelab.club:8084/mqtt, 关于这串地址的含义参考mqtt url。 guest/test分别是测试用户名和密码。

如果你需要独立的用户而不是公共测试用户,欢迎与我们联系,它是免费的。

测试

我们来测试一下Scratch IoT Extension,让它与外部程序协同使用。有很多mqtt的测试工具可以选择,诸如

我选择python社区的工具hbmqtt。

首先安装它: pip3 install hbmqtt

订阅从Scratch发来的消息

hbmqtt_sub --url mqtt://guest:test@iot.codelab.club -t "/scratch3_pub"

发布消息给Scratch3.0

hbmqtt_pub --url mqtt://guest:test@iot.codelab.club -t "/scratch3_sub" -m "hello from hbmqtt_pub"


当然你可以选择任意的mqtt client与Scratch IoT Extension通信,无论它来自树莓派还是来自esp8266,都没有问题。

CodeLab关注开放性和通用性。

codelab-adapter iot extension

extension_iot.py的源代码已经放出。 它将在codelab-adapter 0.8.0中作为内置插件。

目前它已经能够与Scratch IoT Extension协同工作:

extension_iot.py不是开箱即用的那类插件(Cozmo/usbMicrobit是开箱即用的),我们在其中构建了pub/sub的基本例程。只需微调。加入你自己的业务代码(一般和硬件或本地服务有关),处理收发的消息。你可以将任何设备消息化,进而将其积木化。

添加业务代码的位置,我已经在源码中注释了。

你可以把extension_iot.py当作类似extension_eim.py的插件,它本身只是处理消息,没有实际用途,但通过微调,它可以成为任何东西,我们在extension_python_kernel.pyextension_vector.py展示了EIM(everything is a message)概念的威力。 我们将MQTT视为一个信道,在编程方面,我们会延续EIM的风格。

本周,我会给出一个具体例子: 在树莓派中使用extension_iot.py,定制出extension_iot_rpi.py, 而后者是可以实际服务于硬件教学的插件。 在这个例子中我们将展示,如何在几天内快速构建一个教学产品,可以直接推向最终用户,它甚至包括了管理功能(如远程故障处理和升级)!

目前有两家公司会与我们一起推进树莓派方向的工作。也欢迎更多人一起加入,把树莓派改造为一个开放、通用、可扩展的硬件教学平台。

这些工作充分展示了adapter的开放架构如何帮助构建生态。

IoT server

CodeLab构建了自己的server: iot.codelab.club

原本想找一个公开可用的mqtt server(MQTT Messaging Broker),却没有找到合适的,要么就是注册很烦,要么就是限制很多,要么就是不兼容开放标准,要么就是服务器在国外,访问不方便,不得已,只好自建了一个。

iot.codelab.club提供了mqtt测试用户:

用户名: guest, 密码: test

完整的mqtt url为:mqtt://guest:test@iot.codelab.club

你可以使用任何mqtt client连接它, mqtt python client的例子在这里:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import logging
import asyncio

from hbmqtt.client import MQTTClient, ClientException
from hbmqtt.mqtt.constants import QOS_0

username = "guest"
password = "test"
mqtt_url = "mqtt://{}:{}@iot.codelab.club".format(username, password)

async def uptime_coro():
    C = MQTTClient() # todo: clientid
    await C.connect(mqtt_url)
    await C.subscribe([
            ('/scratch3_pub', QOS_0),
         ])
    try:
        while True:
            message = await C.deliver_message()
            topic = message.topic
            payload = message.data.decode()
            print("%s => %s" % (topic, payload))
        await C.unsubscribe(['/scratch3_sub'])
        await C.disconnect()
    except ClientException as ce:
        logging.error("Client exception: %s" % ce)

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(uptime_coro())

如果你想在micropython的兼容板中接入它,使用umqtt即可。

如果你需要iot.codelab.club的独立用户,可以向我们免费申请。

enjoy it~

参考