Welcome

目前MSRA intern,现阶段从事文摘生成方向研究。对NLP感兴趣或对博客内容有疑惑及意见建议的,欢迎评论或添加我微信。此外如果有需要内推的同学,也欢迎来骚扰我。联系方式详见contact页面。

s3c2440移植MQTT

s3c2440移植MQTT

阅读数:1,282

因为项目需要从机接收MQTT广播,网上有关2440的MQTT移植文章非常少,懵逼死我了,所以移植成功以后先把它写出来,给有需要的人看。我当时是参考了下面几篇文章,但是都不能顺利完成,几篇文章写得很好,需要相互借鉴。

http://blog.sina.com.cn/s/blog_951adad70101tnyg.html

http://zhuzhouhong8.blog.163.com/blog/static/17480522016116454950/

http://blog.csdn.net/xukai871105/article/details/39252653

http://www.amobbs.com/thread-5643406-1-1.html

虽然最后移植成功了,但是感觉方法有点死,如果照着上面几篇的步骤都不能完成,没有办法了,可以照着我的步骤来。

注:如果虚拟机之前安装了openssl,建议先将其卸载,再来照着我的步骤安装,其中涉及到库的路径设置,如果自己能把握,可以不用卸载。

1.准备两个虚拟机,没有安装openssl的,只要将虚拟机的文件复制一份就有两个虚拟机了。
环境:
虚拟机:ubuntu9.10
交叉编译器:4.4.3

2.在其中一个虚拟机中交叉编译openssl。
因为MQTT需要用到openssl库,所以编译MQTT前要先编译openssl。
可以百度openssl-0.9.8e.tar.gz,随便找一个就可以,最好和我的版本相同,防止版本导致的问题。
我将其放在了”/home/MQTT”路径。

tar zxvf openssl-0.9.8e.tar.gz
cd openssl-0.9.8e
./config no-asm shared --prefix=/home/MQTT/openssl

prefix后面的是生成的库的路径,可以随便找个地方建个文件放着,这个库在之后是有用的。
修改

Makefile CC=arm-none-linux-gnueabi-gcc
make
make install

openssl的动态链接库就建立完成了。

3.交叉编译MQTT
a. 下载源码

http://www.eclipse.org/paho/

点击DownloadNow,选择Client下的C源码(注意,是C client for Windows/Unix/Mac)。点击GitHub链接,找到左边的Branch,选择develop,选中之后再次点击Branch,选择Tags,选择v1.0.3。我试过V1.1.0,通过我的方法编译不了,可能做了些修改。选择完以后点击右边的Clone or download,选择download zip就可以了。
b. 我将其放在了”/home/MQTT”路径下,tar,进入文件夹。进入Makefile在最开头的.PHONY:的下面加两句话

INCLUDES = -I/home/MQTT/openssl/include
LIBSDIR  = -L/home/MQTT/openssl/lib

这是把刚才编译的openssl的库路径加进去,后面的路径就是你库存放的位置。我是放在/home/MQTT/openssl这个位置的。

添加方式像这样

.PHONY: clean, mkdir, install, uninstall, html

INCLUDES = -I/home/MQTT/openssl/include
LIBSDIR  = -L/home/MQTT/openssl/lib

ifndef release.version

然后到文件的第181行,在”${CC}” 后面加上”$(INCLUDES)”,在最后加上”$(LIBSDIR)”,生成的时候需要库,要把库的路径添加进去。

${CC} $(INCLUDES) -g -o $@ $< -l${MQTTLIB_CS} ${FLAGS_EXES} $(LIBSDIR)

在第187行,203行,215行做同样处理。最好和我用一样的版本,一个是这个位置不对,另一个是我之前用的1.10版本的,这样子做没有效果。

c.编译

make CC=arm-linux-gcc

编译成功。我之前在这里遇到很多问题
例如:collect2: ld returned 1 exit status ar
解决方法:具体原因不清楚,只能重新和我的做法比对,一定有没做对的地方。
例如:找不到ssl。
解决方法:我是编译openssl的交叉编译器和编译MQTT的交叉编译器不是一个版本,导致的找不到ssl。
我在这里卡了很久,大部分问题都是编译器或MQTT的版本的问题导致的。

d.将文件移入开发板。
把build/output目录下的所有动态库文件移入开发板的lib目录下,把sample文件夹整个例如开发板,位置随意。test目录不用管。我把sample文件夹就放在了根文件的顶层目录。
./sample/subasync
执行自带的测试文件,如果提示没有权限,就把这个文件移到文件夹外执行,也就是直接单独放在顶层目录。
./subasync
1)如果提示no found之类的,在Ubuntu下找到交叉编译器的位置
/work/tools/opt/FriendlyARM/toolschain/4.4.3/lib
这是我的位置,把lib目录下所有的东西都复制到开发板lib目录下。如果是别的交叉编译器,可能在lib的同层有libc目录,这个目录下的也都拷贝过去。
./subasync
2)还有个提示记不得了,字母I开头的,两个单词,那个是你的内核或者根文件交叉编译用的编译器和现在的版本差别太大。我直接改用了友善之臂提供的内核和根文件,错误就消失了。
3)如果运行以后什么输出也没有,过了很久提示连接失败,是主机IP没有设置好,以subasync.c为例,修改

#define ADDRESS     "tcp://localhost:1883"为	#define ADDRESS      "tcp://192.168.1.110:1883"

192.168.1.110为mosquitto服务端IP地址。
重新交叉编译就可以了。

在PC机没有开启服务前,如果一切正常的话,运行./subasync以后很快就输出连接失败。
如果服务器已经开启,会输出几行,内容忘记了,只记得最后一句是按q退出。

4.PC安装MQTT
这需要在另一台虚拟机上安装了,因为我试过在第一台虚拟机上直接安装MQTT服务,还是会提示找不到ssl,虽然之前已经安装过了,但是因为库路径等各种原因,导致不行,如果要强行装上,那如果开发板的MQTT需要重新修改什么的,就没法交叉编译了,最方便的方法就是再开一台清白的虚拟机。

运行命令

wget http://mosquitto.org/files/source/mosquitto-1.4.5.tar.gz

解压

tar zxfv mosquitto-1.4.5.tar.gz
# 进入目录
cd mosquitto-1.4.5
# 编译
make
# 安装
sudo make install

如果提示找不到openssl/ssl.h,就安装openssl

sudo apt-get install libssl-dev

如果遇到其他问题,先看最前面的几篇文章,里面有讲一些。

一套MQTT需要一个代理,一个服务器,一个客户端
代理和服务器可以由一台Ubuntu代替,打开两个控制台就行了,客户端是开发板。

打开控制台,启动代理服务

mosquitto -v

再打开一个控制台,发布内容

mosquitto_pub -t sensor  -m haha
    【sensor  】主题
    【haha】指定消息内容

sensor和haha可以自己代替掉,但是sensor 必须和开发板订阅的主题是相同的,否则开发板接收不到。如果没有对subasync.c文件做其他修改,默认的主题是”MQTT Examples”,可以自己在c文件里修改主题。
回车以后就可以在开发板上看到广播了。

 

Dodo