基于Android的串口聊天室 (基于tiny4412) 一

硬件平台: tiny4412ADK + S700 4GB Flash

Android版本:Android-5.0.2

Linux版本: Linux-3.0.86

Bootloader:Superboot

下面的例子是基于Andrioid源码中自带的一个串口应用SerialChat,Android已经把与之相关的Freamwork、JNI代码,其中直接在JNI中调用了Linux的系统调用,没有遵循Android的HAL架构,根本就没有提供HAL。

下面是相关的代码路径:

APP:

frameworks/base/tests/SerialChat/

SerialManager:

frameworks/base/core/java/android/hardware/SerialManager.java

SerialService:

frameworks/base/services/core/java/com/android/server/SerialService.java

SerialPort:

frameworks/base/core/java/android/hardware/SerialPort.java

JNI:

frameworks/base/services/core/jni/com_android_server_SerialService.cpp

frameworks/base/core/jni/android_hardware_SerialPort.cpp

AIDL:

frameworks/base/core/java/android/hardware/ISerialManager.aidl

编译:

[email protected]:~/tiny4412_android5/android-5.0.2# . setenv 
including device/lge/mako/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/friendly-arm/tiny4412/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/asus/tilapia/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including sdk/bash_completion/adb.bash
 
[email protected]:~/tiny4412_android5/android-5.0.2# mmm frameworks/base/tests/SerialChat/
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0.2
TARGET_PRODUCT=full_tiny4412
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a9
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.13.0-32-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=LRX22G
OUT_DIR=out
============================================
make: Entering directory `/root/tiny4412_android5/android-5.0.2‘
target Java: SerialChat (out/target/common/obj/APPS/SerialChat_intermediates/classes)
Copying: out/target/common/obj/APPS/SerialChat_intermediates/classes-jarjar.jar
Copying: out/target/common/obj/APPS/SerialChat_intermediates/emma_out/lib/classes-jarjar.jar
Copying: out/target/common/obj/APPS/SerialChat_intermediates/classes.jar
Proguard: out/target/common/obj/APPS/SerialChat_intermediates/proguard.classes.jar
ProGuard, version 4.10
Reading program jar [/root/tiny4412_android5/android-5.0.2/out/target/common/obj/APPS/SerialChat_intermediates/classes.jar]
Reading library jar [/root/tiny4412_android5/android-5.0.2/out/target/common/obj/JAVA_LIBRARIES/core-junit_intermediates/classes.jar]
Reading library jar [/root/tiny4412_android5/android-5.0.2/out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/classes.jar]
Reading library jar [/root/tiny4412_android5/android-5.0.2/out/target/common/obj/JAVA_LIBRARIES/ext_intermediates/classes.jar]
Reading library jar [/root/tiny4412_android5/android-5.0.2/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar]
Preparing output jar [/root/tiny4412_android5/android-5.0.2/out/target/common/obj/APPS/SerialChat_intermediates/proguard.classes.jar]
  Copying resources from program jar [/root/tiny4412_android5/android-5.0.2/out/target/common/obj/APPS/SerialChat_intermediates/classes.jar]
target Dex: SerialChat
Copying: out/target/common/obj/APPS/SerialChat_intermediates/classes.dex
target Package: SerialChat (out/target/product/tiny4412/obj/APPS/SerialChat_intermediates/package.apk)
Install: out/target/product/tiny4412/data/app/SerialChat/SerialChat.apk
make: Leaving directory `/root/tiny4412_android5/android-5.0.2‘
 
#### make completed successfully (13 seconds) ####

安装:

adb install –r out/target/product/tiny4412/data/app/SerialChat/SerialChat.apk

点击运行,会出错退出。

现在作如下修改:

  • frameworks/base/tests/SerialChat/Android.mk
   1:  #
   2:  # Copyright (C) 2011 The Android Open Source Project
   3:  #
   4:  # Licensed under the Apache License, Version 2.0 (the "License");
   5:  # you may not use this file except in compliance with the License.
   6:  # You may obtain a copy of the License at
   7:  #
   8:  #      http://www.apache.org/licenses/LICENSE-2.0
   9:  #
  10:  # Unless required by applicable law or agreed to in writing, software
  11:  # distributed under the License is distributed on an "AS IS" BASIS,
  12:  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13:  # See the License for the specific language governing permissions and
  14:  # limitations under the License.
  15:  #
  16:   
  17:  LOCAL_PATH:= $(call my-dir)
  18:  include $(CLEAR_VARS)
  19:   
  20:  LOCAL_MODULE_TAGS := tests
  21:   
  22:  LOCAL_SRC_FILES := $(call all-subdir-java-files)
  23:   
  24:  LOCAL_PACKAGE_NAME := SerialChat
  25:   
  26:  LOCAL_CERTIFICATE := platform
  27:   
  28:  include $(BUILD_PACKAGE)
  • frameworks/base/tests/SerialChat/AndroidManifest.xml
   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <!-- Copyright (C) 2011 The Android Open Source Project
   3:   
   4:       Licensed under the Apache License, Version 2.0 (the "License");
   5:       you may not use this file except in compliance with the License.
   6:       You may obtain a copy of the License at
   7:   
   8:            http://www.apache.org/licenses/LICENSE-2.0
   9:   
  10:       Unless required by applicable law or agreed to in writing, software
  11:       distributed under the License is distributed on an "AS IS" BASIS,
  12:       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13:       See the License for the specific language governing permissions and
  14:       limitations under the License.
  15:  -->
  16:   
  17:  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  18:      package="com.android.serialchat"
  19:      android:sharedUserId="android.uid.system">
  20:   
  21:      <uses-permission android:name="android.permission.SERIAL_PORT"/>
  22:   
  23:      <application android:label="Serial Chat">
  24:          <activity android:name="SerialChat" android:label="Serial Chat">
  25:              <intent-filter>
  26:                  <action android:name="android.intent.action.MAIN" />
  27:                  <category android:name="android.intent.category.DEFAULT" />
  28:                  <category android:name="android.intent.category.LAUNCHER" />
  29:              </intent-filter>
  30:          </activity>
  31:      </application>
  32:  </manifest>
  • frameworks/base/core/res/res/values/config.xml

为什么要修改这个文件呢?在这个文件中配置那些设备节点作为串口设备,在tiny4412平台一共有四个串口,COM0和COM3在底板上用DB9引了出来,对应的设备节点是/dev/ttySAC0、/dev/ttySAC1、/dev/ttySAC2、/dev/ttySAC3,所以修改如下:

 <!-- List of paths to serial ports that are available to the serial manager.
         for example, /dev/ttyUSB0
  -->
<string-array translatable="false" name="config_serialPorts">
    <item>"/dev/ttySAC0"</item>
    <item>"/dev/ttySAC1"</item>
    <item>"/dev/ttySAC2"</item>
    <item>"/dev/ttySAC3"</item>
</string-array>

在frameworks/base/tests/SerialChat/src/com/android/serialchat/SerialChat.java中:

    @Override
    public void onResume() {
        super.onResume();
 
        String[] ports = mSerialManager.getSerialPorts();
        if (ports != null && ports.length > 0) {
            try {
                mSerialPort = mSerialManager.openSerialPort(ports[0], 115200);
                if (mSerialPort != null) {
                    new Thread(this).start();
                }
            } catch (IOException e) {
            }
        }
 
    }

从上面的代码可以发现,调用getSerialPorts返回的就是在config.xml中配置的串口设备,这里ports[0]就是”/dev/ttySAC0”,在这里我们使用COM3,对应的是ports[3],所以这里作如下修改:

mSerialPort = mSerialManager.openSerialPort(ports[3], 115200);

重新编译:

mmm frameworks/base/core/res/   # 编译出来的是framework-res.apk,替换/system/framework下的framework-res.apk

mmm frameworks/base/tests/SerialChat/ # 先卸载,在安装 (卸载 adb uninstall com.android.serialchat)

下面是测试结果:

  • 这个是串口调试助手,运行在PC机上。

  • 下面是tiny4412上运行SerialChat,输入完毕点击即可发送。

下载地址: http://pan.baidu.com/s/1nWHP0

完。

时间: 2024-10-09 22:26:18

基于Android的串口聊天室 (基于tiny4412) 一的相关文章

分享基于 websocket 网页端聊天室

博客地址:https://ainyi.com/#/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websocket 网页端聊天室 WebSocket 协议是基于 TCP 的一种新的网络协议.它实现了浏览器与服务器全双工 (full-duplex) 通信--允许服务器主动发送信息给客户端. 使用 java 开发后台 需要导入一个jar包:javax.websocket-api-1.0-rc4.jar 后台

基于flask的网页聊天室(二)

基于flask的网页聊天室(二) 前言 接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下 具体内容 这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用flask-sqlalchemy来辅助创建 首先修改之前的init文件为: from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() from web_chatroom.models impor

swoole 1.79 websocket 聊天室 基于swoole_server

基于 swoole 1.79 swoole_server 写的 websocket 网页聊天室,基本功能,以供参考 所需环境 php swoole 1.79 redis <a href="http://pan.baidu.com/s/1o6uTT7W">源码百度网盘下载</a>

.NET Core 基于Websocket的在线聊天室

什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后就会断开连接. 在没有websocket之前web系统如果要做双工通讯往往使用http long polling技术.http long polling 每次往服务器发送请求后,服务端不会立刻返回信息来结束请求,而是一直挂着直到有数据需要返回,或者等待超时了才会返回.客户端在结束上一次请求后立刻再发

nodejs 基于socket.io实现聊天室

由于之后要做的网页视频直播项目要用到socket.io模块,所以特地花时间研究了下,参照网上的代码做了些改进,自己写了个聊天室代码.不得不承认后端事实推送能力有点厉害,这是以前我用php一直苦恼的事情.下面简单介绍下我的项目,顺带讲解下nodejs. 事实上,在看别人写的代码之前,我一直不知道nodejs是干嘛的,直到真正接触到才明白这也可以算作是服务端代码,丰富的第三方库使其功能极其强大.它可以像golang的beego一样直接通过命令行开启服务器,不过要用到express模块.加载模块的方式

15.基于UDP协议的聊天室程序

使用UDP协议完成一个聊天室程序的小项目,大部分代码都有注释,一看就能看到的. 实现的功能:               (1)查看/显示已经登陆的用户信息               (2)向已登陆的用户发送消息               (3)输出错误消息,给予提示               (4)退出 共有三个文件: chat_public.h #ifndef _CHAT_PUB_H_ #define _CHAT_PUB_H_ //chat_public.h #include <lis

基于Node的Web聊天室

1 项目名称 Web聊天室(<这是NodeJs实战>第二章的一个案例,把整个开发过程记录下来) 2 项目描述 该项目是一个简单的在线聊天程序.打开聊天页面,程序自动给用户分配一个昵称,进入默认的Lobby聊天室.用户可以发送消息,也可以使用聊天命令(聊天命令以/开头)修改自己的昵称或者加入已有的聊天室(聊天室不存在时,创建新的聊天室).在加入或创建聊天室时,新聊天室的名称会出现在聊天程序顶端的水平条上,也会出现在聊天消息区域右侧的可用房间列表中.在用户换到新房间后,系统会显示信息以确认这一变化

Unity手游之路&lt;三&gt; 基于Unity+Java的聊天室源码

http://blog.csdn.net/janeky/article/details/17233199 项目介绍 这是一个简单的Unity项目,实现最基本的聊天室群聊功能.登录聊天室后,用户可以输入信息进行发言,其他人可以收到消息.玩家还可以更改昵称.项目详细描述的前后端Socket通信,编码,解析二进制流的过程. 这个项目的主要目标有几个: 1.实现Unity的前后端通信进制          2.学习Protobuf的应用 最终的效果 前端            a.网络通信NetClie

Flask基于websocket的简单聊天室

1.安装gevent-websocket pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket 2.chat.py文件内容如下: from flask import Flask,request,render_template import json from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import