学习sylixos
SylixOS开发环境获取
开发环境可以在翼辉官网申请
申请时候需要填写一些公司和个人的信息,经过审核后,下载链接和注册码会发送给你。
代码结构
压缩包打开之后如图所示,双击InstallWizard进行安装。选择安装IDE(过程还挺慢的~~)。
安装过程时候,简单看了一下目录中,还有一个虚拟机,x86架构的,果断想尝试一下,先看看sylixOS到底长什么样子。
安装完IDE之后,桌面会有模拟器的图标
我们可以选择一个x86的虚拟系统进行与sylixOS的初次见面。
启动之后,会自动弹出一个命令行,
ps,ll等命令,相信用过linux的同学还是比较熟悉。(虽然结果不太相同)
第一个APP
参考应用开发即可
此处写一下如何使用系统提供的第三方库,我测试一个demo,使用的是sqlite3,SylixOS是带了sqlite3的,不过默认编译APP的时候,是不会去主动搜索相关头文件和库的,所以右键工程,选择properties
将sqlite的头文件路径添加进去,就在sylixOSbase中去选择,
然后添加sqlite的库,
在linker setting中选择sqlite3的库,同样是在sylixOS base中去选择。
然后编译,就可以通过了
移植开源软件libcurl
项目用到需要使用restful接口,所以需要增加libcurl库,参考《应用开发手册》中的openssl库移植方法。
下载libcurl的源码
访问https://curl.se/download.html,可以获得最新curl的代码
预处理
我要将代码移植到x86_64的系统下,所以找了一个x86_64的环境,将curl的源码解压,执行
[root@localhost curl-7.76.0]# ./configure
然后执行
[root@localhost curl-7.76.0]# make
这么做的目的就是为了查看x86_64的架构,需要编译哪些文件,以及会生成哪些配置
编译之后,执行
[root@localhost curl-7.76.0]# find -name *.o
会看到编译了哪些c文件生成了.o文件
这些文件后续会在修改sylixos的编译文件中用到,然后拷贝出整个cur的目录备用。(像做菜一样的说法)
(注意:有些文件在.lib中是属于重复的,剔除之;)
(注意:有些文件名称增加了前缀,要对比实际C文件进行删除)
新建移植工程
在NEW-》PROJECT中创建新的共享库工程Shared lib
工程创建完成,删除src中自动生成的libcurl.c,然后将之前在linux里面编译过的文件夹里面的内容拷贝到src目录下。手动删除那些之前生成的.lo和.o文件。
修改配置文件
修改libcurl.mk
首先修改src文件
然后修改头文件搜索路径
(注意:此处要对工程配置有个修改,不允许自动扫描源文件,否则就白改了)
编译
右键工程,进行build,会开始报一堆错误。逐个进行修改
主要遇到的问题都可以通过参照linux下生成的Makefile,
把一些定义放到libcurl.mk中的LOCAL_DSYMBOL变量里,
把一些CFLAG放到LOCAL_CFLAGS变量中。
最终会编译出两个库文件,
链接库
参照IDE使用手册,增加所生成的libcurl的库,即可完成链接。不过当我使用动态库的时候,不上传库,程序执行提示找不到库,上传了库,程序执行提示找不到函数,没办法使用了静态库,运行成功。
curl参考代码
int file_download(char *url,const char* postpara)
{
CURL *image;
CURLcode imgresult;
FILE *fp = NULL;
//char *testurl="https://github.com/openssl/openssl/blob/master/NOTES-DJGPP.md";
//char *testurl="https://github.com/openssl/openssl/blob/master/LICENSE.txt";
image = curl_easy_init();
if (image)
{
fp = fopen("/tmp/xxx.txt", "wb");
if (fp == NULL)
{
printf("File cannot be opened");
return -1;
}
if (0 == strncmp(url, "https:", 6))
{
curl_easy_setopt(image, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(image, CURLOPT_SSL_VERIFYHOST, 0);
}
curl_easy_setopt(image, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(image, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(image, CURLOPT_URL, url);
curl_easy_setopt(image, CURLOPT_FOLLOWLOCATION, 1);
//这里限速 100KB/s
//curl_easy_setopt(image, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t)1000 * 1024 * 8);
curl_easy_setopt(image, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(image, CURLOPT_CONNECTTIMEOUT, 30); //设置连接超时,单位s, CURLOPT_CONNECTTIMEOUT_MS 毫秒
curl_easy_setopt(image, CURLOPT_TIMEOUT, 5); // 整个CURL 执行的时间, 单位秒, CURLOPT_TIMEOUT_MS毫秒
curl_easy_setopt(image, CURLOPT_NOSIGNAL, 1); //linux多线程情况应注意的设置(防止curl被alarm信号干扰)
if(postpara)
{
curl_easy_setopt(image,CURLOPT_POST, 1); // 设置 为POST 方法
curl_easy_setopt(image,CURLOPT_POSTFIELDS, postpara); // POST 的数据内容
curl_easy_setopt(image, CURLOPT_POSTFIELDSIZE, strlen(postpara)); // POST的数据长度, 可以不要此选项
}
//CURLOPT_RESUME_FROM
// Grab image
imgresult = curl_easy_perform(image);
if (imgresult)
{
//cout << "Cannot grab the File!\n";
return -1;
}
//Clean up the resources
curl_easy_cleanup(image);
//Close the file
fclose(fp);
}
return 0;
}
核心文件libcurl.mk参考下载
移植开源软件json-c
json格式是程序员们喜闻乐见的传输数据的格式,sylixos本身没有json数据的解析,所以,移植了常用的json库-c语言的json-c。
代码下载
创建新share lib工程
参考标准流程,创建工程。名称libjsonc,然后删除src其中的libjsonc.c,然后拷贝json-c源码中根目录下面的.c和.h文件过来。
核心步骤来了:拷贝一个其他项目用过的json-c目录中的config.h和json_config.h过来,这两个文件中定义了很多正常编译的宏,经过简单的修改,就可以满足编译。
然后右键build project。即可以生成.so和.a文件。
json-c实例代码
const char emp_msg[8]="";
const char* json_get_char(json_object *src_obj,char* name)
{
struct json_object *tmp = NULL;
tmp=json_object_object_get(src_obj, name);
if(tmp==NULL)
return emp_msg;
else
return json_object_get_string(tmp);
}
int json_get_int(json_object *src_obj,char* name)
{
struct json_object *tmp = NULL;
tmp=json_object_object_get(src_obj, name);
if(tmp==NULL)
return 0;
else
return json_object_get_int(tmp);
}
int test_json(void)
{
struct json_object *obj_root = NULL;
int device_count=0;
int devi = 0;
int i = 0;
obj_root = json_object_from_file("/tmp/test.json");
if(obj_root==NULL)
{
printf("!!!config_parse get json_tokener_parse fail\n");
return 1;
}
else
{
char res[128]={0};
strcpy(res,json_get_char(obj_root, "gid"));
printf("get [%s]\n",res);
json_object_put(obj_root);
}
return 0;
}
核心文件.mk和.h参考下载
SylixOS虚拟机连接外网
官方文档提供的方式,会自动创建一个虚拟网卡,电脑和虚拟机采用固定IP通讯,但是如果想让虚拟机连接外部其他服务器,需要做些特殊尝试。
首先利用自己及其上其他可用网络,将其修改共享到虚拟机使用的虚拟网卡
共享之后,以太网3会自动设置为其他一个ip192.168.137.1。和默认的192.168.7.x网段不同。
然后手动修改虚拟机的ip,掩码和网关,用到以下指令
ifconfig en1 inet 192.168.137.91
ifconfig en1 netmask 255.255.255.0
ifconfig en1 gateway 192.168.137.1
route add default gw 192.168.137.1
然后在虚拟机里就可以ping同外网了,不过仅限于ip,
如果想ping外网域名,需要配置dns,例如配置成114.114.114.114
ifconfig dns 0 114.114.114.114