物联网是个交叉学科,涉及通信技术、传感技术、网络技术以及RFID技术、嵌入式系统技术等多项知识,但想在本科阶段深入学习这些知识的难度很大,而且部分物联网研究院从事核心技术工作的职位都要求硕士学历,“LPWAN实验室”计划从收集、整理、翻译实用的物联网有关的知识着手,帮助各高校物联网专业学生利用这个实验室学习平台找准专业方向、夯实基础,同时增强实践与应用能力。虽然现在面临大学生毕业就业难的情况,但实际各行各业却急需物联网领域相关专业的人才,从目前情况来看,环保、安防、智能交通、农业、医疗推广的可能性最大,这也是成为高校热门专业的一个重要原因。从工信部以及各级政府所颁布的规划来看,物联网在未来十年之内必然会迎来其发展的高峰期。而物联网技术人才也势必将会“迎娶”属于它的一个美好时代。

LoRa开发8: 下载源代码
1 源代码下载地址 源代码可以从以下链接下载: http://download.csdn.net/detail/jiangjunjie_2005/9657161 2 开发环境与工具 硬件平台:锐米LoRa终端 http://www.rimelink.com/pd.jsp?id=2 测试套件:USB转串口 + LoRa终端转接板 https://shop140974727.taobao.com/?spm=2013.1.1000126.d21.DL6hVR 仿真器:  ST LINK V2 https://item.taobao.com/item.htm?spm=2013.1.20141002.4.Sj743Y&scm=1007.10009.31621.100200300000004&id=540446816750&pvid=8a31520e-d2bd-4a21-b940-aa421c82d92d IDE环境:IAR for STM8  http://www.rimelink.com/nd.jsp?id=33&_np=105_315 3 编译对应的进程 void main(void) { //   process_start(&TxRandData, NULL); //   process_start(&RxPrintSNRRSSI, NULL); process_start(&PingPong, NULL); } 在源代码main.c中,屏蔽不需要的进程,仅允许编译一个进程,即可将LoRa终端设置成对应的系统。如上例所示,编译了PingPong进程。 4 源代码结构 main.c        基于C语言系统的入口函数 main.h        系统的全局配置文件 Application  应用程序,以Contiki系统的protothread方式组织 Contiki        Contiki操作系统 Driver     […] Read more.
LoRa开发7:PingPong系统
  1 引言 前2章介绍了SX1278的发送和接收,在此基础上,我们设计一个有趣的PingPong系统,更好地理解LoRa终端的收发逻辑。 该系统将LoRa终端自动定义成2种角色:master和slave。master主动发送ping数据帧,接收pong数据帧;slave如果接收到ping数据帧,回应pong数据帧。 2 整体逻辑流程 如上图所示,当LoRa终端上电后,在(2 * PingPongPeriod)周期内没有接收到ping数据帧,它就认为自己是master。Master节点每隔(1 * PingPongPeriod)周期主动发送ping数据帧,然后启动RF接收,可能接收到pong回应帧(正常通信),也可能接收超时(slave没有上电或通信失败)。 同理,当LoRa终端上电后,在(2 * PingPongPeriod)周期内接收到ping数据帧,它就认为自己是slave。Slave节点启动RF接收,如果接收到ping数据帧,它将发送pong回应帧。 一个节点从上电,判断自身角色,根据角色处理逻辑,如下流程图所示。 3 代码剖析 PROCESS_THREAD(PingPong, ev, data) { #definePING    “ping, this is MASTER ofrime node.” #definePONG    “pong, this is SLAVE of rimenode.” #definePING_SIZE    34 #definePONG_SIZE    33   staticbool    s_bIsMaster; staticuint16_t    s_wPingPongPeriod; staticint32_t    s_lTxCnt = 0; staticint32_t    s_lRxCnt = 0;   PROCESS_BEGIN(); […] Read more.
LoRa开发6:接收数据帧
1 引言 接收LoRa数据帧比发送稍复杂一些,接收是一个异步动作—-不知道下一帧什么时候到来;因为干扰或信号微弱等,接收可能会出错;甚至,当多次接收错误后,RF可能会宕机—-再也无法接收任何数据帧。 本章,我们继续基于Contiki和SX1278,开发接收数据帧的代码。 2 整体逻辑流程 接收数据帧的整体逻辑流程如下所示,特别注意的是,添加了处理异常的代码:如果RF接收错误(硬件自检payloadcrc16失败)或数据帧错误(用户CRC16失败),进程会重启动RF的接收,以防止陷入宕机(根据我们多年的经验,这种缺陷是可能发生的)。 3 进程时序 t0时刻:进程启动RF接收; t1时刻:SX1278接收到数据帧,中断服务程序poll进程; t2时刻:进程检验数据帧的CRC16,闪烁LED,打印计数、SNR和RSSI; 4 代码剖析 PROCESS_THREAD(RxPrintSNRRSSI, ev, data) { /*ATTENTION: stack variables can NOT cross any “XX_YIELD()”. */ bool    bFrameOK;                                                     […] Read more.
LoRa开发5:发送随机数据
1 引言 学习需要循序渐进,做开发也不例外。在LoRa终端开发中,最简单的代码是通过SX1278发送数据帧。因此,我们先从发送开始,了解初始化SX1278和建立Contiki进程的入门知识。 2 整体逻辑流程 发送数据帧的整体逻辑流程如下所示,很明显,进程是一个无限循环:生成随机数据帧-> 发送 -> 生成随机数据帧 ->… 3 初始化SX1278 初始化SX1278的代码清单如下,它主要完成射频参数的配置。 static void InitSetLoRa(void) { SX1278Init(&s_stRFEvents);                                                   1 SX1278SetFreq(RADIO_FREQ);                     […] Read more.
LoRa开发4:移植Contiki
1  LoRa终端需要OS吗? 尽管工程师有很多理由拒绝在LoRa终端上使用OS(Operating System,操作系统):“它很复杂”,“没必要”,“内存太小”,“有学习成本”,“要改变编程思维”,“可能不稳定”……然而,基于以下理由,我们强烈推荐移植一个小型OS: 降低复杂度 LoRa终端的复杂度其实比我们想象的要高:它需要驱动SX1278,这需要处理很多事件,如接收数据超时,接收数据错误等;它需要实现网络算法,申请入网,主动上报,低功耗唤醒,断网续连等;它需要管理本地设备,采集传感器数据,控制阀门等。 使用OS,可以将上述任务分解成多个进程,开发者专注于每个进程的实现,可以有效降低复杂度。 复用组件 LoRa终端一定有这样的需求:射频CAD侦听到唤醒信号后,快速通知进程接收数据帧;需要一个软定时器来灵活地延时和唤醒……这些系统组件,OS都提供,要知道,这些丰富的组件可是经过严格测试的。复用成熟稳定的组件是提高软件生产力的有效手段,这方面,操作系统功不可没。 提高CPU效率 当LoRa终端“等待射频发送数据包完成”前,它无事可干;而其他进程希望得到CPU运行权,不用担心,操作系统会完成调度,它会将“因等待而无事可干”的进程阻塞,而将CPU分配给“具备运行条件”的进程享用。 移植性更好 有一天,因为某种原因(需要更强大的计算能力,需要更低成本等)需要更换LoRa终端的MCU,有操作系统支撑的系统就轻松多了,因为应用软件调用的是操作系统的API,它很少与硬件层直接打交道;基本上,只要将操作系统移植到“新MCU平台”,软件系统就OK了。 2  Contiki是一个怎样的OS? Contiki是少有能同时实现2个目标的操作系统:对内存要求极低,同时支持进程阻塞机制。8位单片机的RAM极为宝贵,几KB都是很大了,一般的RTOS(FreeRTOS或uc/os-ii等)无法运行,而Contikil可运行良好;有些操作系统,如OSAL也在极少的RAM上可以运行,但是这种基于“状态机”开发的机制,让代码很难理解,程序执行流在状态中来回判断和切换,让逻辑更复杂。 节能内存 Contiki有一个巧妙的机制来实现进程的调度:当进程被阻塞时,OS记录该进程的下一C语言行号;当进程继续运行时,从记录的C语言行号继续运行。这种机制从2个方面极大节省内存:所有的进程共享一个栈,没有上下文机切换。甚至在小于1KB内存的MCU上,Contiki都可以良好地运行。 进程可以阻塞 在Contiki系统中可以实现如下语句,进程发送无线电数据包,然后阻塞自己,直到发送完毕。这种“优雅”的机制,非常符合程序员思维,同时降低了开发的复杂度。 SX1278Send(packetbuf_dataptr(),packetbuf_datalen()); PROCESS_YIELD_UNTIL(RF_Tx_Done ==s_tRFResult); 移植简单 如果仅使用Contiki的内核,只需要移植clock.c,即从MCU中找一个定时器来给etimer进程提供时钟源。如果使用Contiki的网络协议栈,需要按radio.c实现无线收发函数。 丰富的网络协议栈 针对无线通信,Contiki提供3种MAC协议,还有RIME通信原语和RPL路由协议;针对TCP/IP,Contiki提供uIP协议栈,它支持IPv4和IPv6。 3 怎样移植Contiki? 移植一个操作系统是指将它运行在给定的硬件平台。因为Contiki是非可剥夺的OS,不用实现上下文切换(CPU的寄存器保存与恢复),因此它的内核移植特别容易,一般是实现2个定时器:etimer和rtimer。 如果站在3万英尺的高度,一个基于Contiki嵌入式系统的层次结构如下所示。 考虑2种情况,首先需要升级Contiki更高版本的软件,其次需要将Contiki移植到不同的硬件平台。为了尽可能地减少升级和移植的工作量,增加了ports文件夹,ports目录中文件与core目录中文件低耦合。 3.1 移植Contiki内核 如果仅仅只移植Contiki的内核,那么还是比较容易的,一般说来只需要修改2个文件:clock.c和contiki-conf.h。 clock.c有2个函数需要适配对应硬件平台: void clock_init(void); 设置一定时器,每秒产生CLOCK_SECOND个tick; void SysTick_handler(void); tick中断时递增时间,检测是否有超时事件; contiki-conf.h:设置contiki系统的一些参数,如:CLOCK_CONF_SECOND=100; 3.2 移植rtimer 3.2.1 rtimer用途 Contiki系统引入rtimer可以满足精准定时的需要,一些对时间极为敏感的模块(如MAC协议)依赖于rtimer。和etimer的粗粒度(常见为100Hz)不同,rtimer是细粒度(常见为1kHz)定时器。 3.2.2 rtimer移植 移植rtimer比较容易,基于MCU实现rtimer-arch.c和rtimer-arch.h。 需要特别注意,大多数定时器(尤其是8位MCU)位宽为16位,即MAX=65535, rtimer的频率定为1kHz比较合理,它既可以保证比较好的精度(1ms),又具备65秒的满量程,这可以适应大多数的应用需要。 另外,大多数应用需要随机撤销和重启动rtimer,它可以通过添加2个函数来实现:rtimer_arch_disable_irq()和rtimer_arch_enable_irq()。 关于rtimer更多的原理与应用介绍,请链接: […] Read more.
LoRa开发3:终端驱动设计
1 引言 从表面看,终端驱动就是MCU通过读写SX1278的寄存器,实现射频收发功能。然而,一个优秀的驱动设计,至少满足以下设计目标;最具喜挑战的是,有些目标是相互抵触的。 提供机制:区分策略和机制,驱动仅提供机制,由用户进程实现策略; 接口简单:接口越简单,驱动越好使用,另外,更好实现“高内聚、低耦合”; 提高效率:最大化硬件设备性能,是驱动的重要使命; 节能内存:内存复用和指针传递等方法可以节省MCU宝贵的内存; 易于移植:能在不同的MCU之间低成本移植,该驱动就越优异; 稳定可靠:驱动是硬件和系统软件的黏合层,不能有任何差错。 2 系统层次结构 如图2-1所示,除contiki系统外,应用层也需要调用sx1278 driver,一个典型实例见图2,contiki协议栈依赖radio实现对应功能,应用层也需要设置radio参数和获得RSSI与SNR值。 图2-1  radio相关的系统层次 图2-2 分层系统调用实例 3 接口设计 MCU与LoRa硬件接口如图3-1所示:MCU通过SPI总线与LoRa进行通信,包括设置参数和读写FIFO;当LoRa有异步事件发生时,它通过6根连接线DIO0~DIO5中断MCU;MCU为判断接收和发送数据包是否超时需要设置TIMER,该资源LoRa不需要,仅被MCU所用。 图3-1  MCU与LoRa硬件接口 细化图3-1的设计可以得到图3-2所示驱动:DIO除初始化函数化,还需要DIO0~DIO5对应中断服务函数;SPI需要初始化和输入输出函数;TIMER需要初始化、启动和停止函数。 为方便移植LoRa到不同的MCU,特地将驱动设计成2部分:sx127x_src.c和sx127x_ports.c,前者为LoRa操作函数,后者提供图3-2所示接口。 图3-2  MCU需要提供的硬件驱动 Radio driver为尽可能好地实现功能,它提供如图3-3所示的回调函数接口,当事件(如接收数据包)发生时立即调用对应的方法。 图3-3  radio回调函数 radio一般都有自己的参数,LoRa也不例外,因此提供了图3-4所示的设参接口。 图3-4  LoRa参数设置 4 数据结构 1.  发送数据包 如图4-1所示,发送数据包不用另外开辟内存,直接从tx_process拷贝数据到LoRa FIFO之中。即使本次发送失败(如返回发送超时),也可以实现重传(FIFO和寄存器值仍得以保留)。 图4-1 发送数据包 2.  接收数据包 为节省宝贵的内存,驱动程序通过图4-2的回调函数GetBufPtr()从用户进程获取缓存区指针,然后将接收数据包复制到该缓存;再执行回调函数RxDone(),让用户进程执行所需的逻辑(如:通知其他进程解析该数据包)。 图4-2 接收数据包 5 时序逻辑 为了高效实现radiodriver,引入了中断和定时器机制来实现发送和接收数据包。因为LoRa是半双工通信,只需要使用1个定时器即可用于检测发送和接收是否超时;另外,根据LoRa芯片特性,当事件发生时会产生引脚的电平翻转信号,MCU需要捕捉该中断。 图5-1~图5-7显示了发送、接收和CAD时7种时序。 #1:停止定时器; #2:使SX1278进行休眠状态,节省电能; #3:执行回调函数TxDone(),让用户进程执行所需逻辑; 图5-1 发送成功   #1:使SX1278进行休眠状态,节省电能; […] Read more.
LoRa开发2:终端硬件平台
1 硬件基本框图 一般而言,LoRa终端主要部件包括:MCU,SX1278,TCXO,RF_SWITCH,它们的功能如下表: 部件 功能 MCU 驱动SX1278,实现无线网络协议,与用户系统交互等 SX1278 完成LoRa无线信号的接收与发送 TCXO 为SX1278高频电路提供精确时钟 RF_SWITCH 为半双工的SX1278切换输入或输出状态 一个LoRa终端硬件框图如下所示: 在实际工程应用中,为更好地移植射频部分,会将SX1278、TCXO和RF_SWITCH集成到一个电路板上,做成射频模块。此时,LoRa终端如下所示: 2 射频模块 锐米通信集成了射频模块,该模块的20引脚定义如下图所示: 这20引脚的连接与控制如下表所示:(注:站在SX1278角度,定义引脚类型) 序号 引脚 类型 功能 1 DIO3 数字IO 详见下表“DIO映射模式” 2 DIO4 数字IO 3 DIO5 数字IO 4 SCK 输入 MCU给SX1278提供SPI时钟源 5 MISO 输出 SPI数据总线,MCU输入,SX1278输出 6 MOSI 输入 SPI数据总线,MCU输出,SX1278输入 7 NSS 输入 SPI片选,低电平有效 8 RXTX 输出 SX1278工作状态,高电平=TX,低电平=RX 9 RXE […] Read more.
LoRa开发1:LoRa设计10问
引言: 近2年来,LoRa技术在国内受重视,从高校到企业,再到自主创业者,都在了解和研究。作为从事LoRa研发3年,推出2代LoRa网关的锐米通信,接触许多问询LoRa技术的客户。为此,我们解释一些LoRa技术的常见问题。 1问:LoRa是什么? 答:LoRa是Long Range(长距离)的简称,是一种长距离、低功耗无线通信技术。2009年法国公司Cycleo设计出一种优异的扩频通信算法,后来,该公司被美国semtech公司收购,后者于2013年推出LoRa芯片。目前,semtech公司是LoRa芯片唯一供应商。 2问:LoRaWAN是什么? 答:LoRaWAN是LoRa Wide Area Network(LoRa广域网)的简称,是基于LoRa技术的一种通信协议。它主要包括三个层次的通信实体:LoRa终端、LoRa网关和LoRa服务器。 LoRaWAN是一个较庞大的体系结构,支持CLASS A / B / C三种终端,使用LoRa MAC协议为网关和终端提供防冲突通信和同步机制,有4种服务器角色,分别担任:网络连接、应用管理、接入控制和用户数据。它的层次关系如下: 3问:LoRa有什么优点? 答:最大的优点是长距离传输,采用扩频增益,它的传输距离约FSK的3倍;其次是低功耗,尽管它通信距离空旷能达到5km,仍保持良好的节能特性;再次,它工作在免费ISM频段,这为普通民众使用该无线网络打开了一道便捷之门,极大降低网络铺设成本。 4问:LoRa有哪些缺点? 答:第一个缺点,传输速率低,因为扩频调制后的通信带宽窄,一般只适合传感器网络;第二个缺点,硬件价格高,推出市场的时间不长,没有大规模应用,成本没有被摊薄;第三个缺点,LoRaWAN核心技术(通信协议和算法)需要缴纳会费才能获取,这提高了研发成本和难度。 5问:LoRa与常见无线技术的区别? 答:确实,我们身边的无线技术已经很多了:3G/4G、WiFi、蓝牙和ZigBee,为什么还需要LoRa这种无线技术呢?其实,每种无线技术都只能适应特定通信场景,需要配合使用才能构建高效率、低成本的网络。 打个比方,现代化的军事组织,单兵武器都是配合使用,才能达到最佳火力配制。 无线技术 类比武器 距离 速率 能耗 铺设成本 通信成本 适应场合 LoRa 狙击步枪 超长 慢 低 中 免费 户外传感器 3G/4G 突击步枪 长 较快 高 极高 流量费 通话与上网 WiFi 冲锋枪 短 快 极高 低 免费 […] Read more.
四个案例告诉你“定制树莓派”在企业级市场大有所为
树莓派自2012年推出以来,经过4年技术积淀以及社区运营,它在创客中间已经具备相当的名气了,去年仅英蓓特出货量就达到200多万片,这个对非消费类电路板块来说,是一个很不错的成绩了。 近年来智能硬件概念的兴起,再加上国家层面大力推动“互联网+”、“智慧城市”,越来越多的传统企业参与其中,由此也诞生了很多新的创业公司以及新的业务,涌现出一批批刷新三观的应用。在这个讲究速度与激情的商业时代,比竞争对手先一步,就意味着占领市场先机。在这种形式背景下,如何降低产品的开发难度,减少开发成本,缩短产品上市时间,成了企业最实际的需求,而功能全而接口丰富的单板计算机正迎合了这一需求,非常接地的充当起参考设计原型的角色,因此很多企业在立项阶段就会将其纳入设计考虑范畴,从而催生出庞大的单板计算机应用市场。定制树莓派在这方面以低成本、高可扩展性引人瞩目。 自2015年9月英蓓特开始承接树莓派定制服务以来,陆续收到来自全球的客户订单,其中既有包括了IBM、微软等大客户需求,又有一些中小型企业的需求,要求定制的内容包括: 修改存储方式(比如集成存储器如eMMC替代原SD卡); 添加Zigbee、WiFi,、Z-Wave, Sub-GHz ISM等通信方式, 集成RTC, 增加LTE或者GSM模块, 调整元器件的位置,修改PCB的尺寸, 添加Lora之类的物联网协议, 增删树莓派上的接口 先分享四个最近比较热门领域的企业应用,看看量身定制的树莓派都可以做些什么。 1.Video Conference System(*Pictures are for reference only) 客户: 国内某电子产品公司 平台: Raspberry Pi2 项目应用: 视频会议系统 定制: 特定功能接口定制 2.Hotel Room Electronic Appliance Controller(*Pictures are for reference only) 客户: 国外某酒店服务管理公司 平台: Raspberry Pi2 项目应用: 酒店房间应用控制以及触屏控制 定制: 无线连接及UI功能设计添加 3.Home Automation System(*Pictures are for reference only) 客户: […] Read more.
WAZIUP欧洲项目的教学视频:构建低成本的LoRa物联网设备
如何构建低成本的LoRa IoT设备。 有关github的更多信息:https://github.com/CongducPham/LowCostLoRaGw 学习小组招募: 喜欢动手的程序猿们喜大普奔时刻来临了!来临了!来临了! 来自安爵士亲手制作的有关LoRa网关、终端等硬件开发系列学习视频登陆LoRa学习站,英文好的同学们可以先睹为快了,如果你英文足够好,又有兴趣参与LoRa学习资料翻译组,欢迎注册我们的网站会员并留言“加入学习视频翻译”。 Read more.
LoRa组网案例5:无线电表,唤醒+总线
案例背景 某用电采集系统,为减少布线和施工的代价,计划使用无线采集方案。在方圆1km的区域,连接400块电表。基于国网电表通信协议,响应时间要求小于10秒。需要和某电表通信时: 先广播该电表号和请求命令,约20字节; 对应表号的电表根据命令发送回复帧,约100字节; 非该表号的电表不予回应。 通信拓扑如下图所示: 提取需求 因素 指标 距离 1000米,墙壁、门等会造成信号衰减 带宽 纯负载带宽:(20 * 8 + 100 * 8)bit / 10s =96bps,属于低带宽要求 功耗 要求,电表由市电供应,但数量庞大,节能意义重要。 规模 400个终端,中等规模无线网络 拓扑 唤醒下发+总线上报 成本 终端数量庞大,硬件成本要最低;不允许有流量费用。 应用LoRa系统 这是一个典型的“长距离,低带宽,低成本”无线网络,可以选用锐米LoRa第二代系统。 空中速率档位=远距离,低速率,可以发挥LoRa超长距离通信能力; 频率=470MHz,免费频段; 射频发射功率=20dBm; 终端节点个数=1(解释:400个终端共享总线,地址全部分配为0x0001) 单次上传最大字节=100 Slot时长=4000ms 注释:GetMinSlotLen(100, RF_SPEED_LOW,SYST_TDMA_WAKE)=3610 二次上报间隔=10000ms 唤醒data最大字节=20 唤醒ack最大字节=0 唤醒间隔=10000ms 注释:GetTime4WakeExchange(20, 0, RF_SPEED_LOW)=2083 唤醒间隔与带宽利用如下图所示: Read more.
LoRa组网案例4:无线水表,上报+唤醒
案例背景 水表无线集抄具备很多好处:容易施工、缴费便捷、方便查询等。长期以来困扰该方案的是,既要长距离通信,又要低功耗以延长电池使用寿命。现在,LoRa无线可以解决该难题。 以32层高,每层4户为例,集抄128支水表;每15分钟抄读约10字节用水数据;10秒内能控制任意表计开阀(2字节,欠费停水,续费使用)。 提取需求 因素 指标 距离 层高可达32楼,墙壁和门等会造成信号衰减 带宽 纯负载带宽:(128 * 10 * 8 + 2 * 8 * 90)bit / (15 * 60)s =13bps,属于超低带宽要求 功耗 苛刻,水表电池供电,非通信时段要求休眠节能 规模 128个终端,小等规模无线网络 拓扑 主动上报+唤醒下发 成本 终端数量庞大,硬件成本要最低;不允许有流量费用。 应用LoRa系统 这是一个典型的“长距离,低功耗,低带宽,低成本”无线网络,可以选用锐米LoRa第二代系统。 空中速率档位=远距离,低速率,可以发挥LoRa超长距离通信能力; 频率=470MHz,免费频段; 射频发射功率=20dBm; 终端节点个数=128 单次上传最大字节=10 Slot时长=7000ms 注释:GetMinSlotLen(10, RF_SPEED_LOW,SYST_TDMA_WAKE)=1795 二次上报间隔=900000ms 唤醒data最大字节=2 唤醒ack最大字节=0 唤醒间隔=7000ms 注释: GetTime4WakeExchange(2, 0, RF_SPEED_LOW)=1680 唤醒间隔与带宽利用如下图所示: Read more.