AS的APP接收HC-06蓝牙模块数据

AS的APP接收HC-06蓝牙模块数据

总体思路

这是我的一次课程设计,要求是下位机端用阅读器、单片机读出高频卡的卡号,上位机端通过HC-06蓝牙模块进行数据的接收,并做成小型的图书馆系统,具有借书、还书、注册登录、查询等功能。

下位机端

虽然我是物联网的学生,但是无奈硬件知识很垃圾,使用的是51单片机和RC522阅读器,进行刷卡,显示卡号,首先要确保在串口上有正确的卡号输出,这样下位机才算完成。
上位机端的代码其实就是51单片机的代码,用的是KEIL软件编写的,其实是复制粘贴的,代码很好用,我会上传上来的。具体操作就是编译生成二进制文件(.hex),利用串口调试助手下载到单片机上,再打开串口,会发现接收到:+12f34e37.
+12f34e37.
+12f34e37.
其中(12f34e37)为高频卡的卡号,每一张卡都是不一样的,我在输出中添加了+.是为了传到上位机后,来作为识别一串卡号的标志,当然其它标志或其他方法都是可以的。

上位机端

关于使用的软件:
这学期课程有Android Studio的学习,所以用这个软件进行APP的设计开发,另外其带有轻量级的数据库,所以就没有使用MYSQL、SQL,还下载了SQLiteStudio,以方便的进行数据库的建立与表的动态操作。
关于设计思路

1.首先接收下位机端传来的数据,即读到的卡号,这里采用了蓝牙模块,因此上位机端要设置蓝牙适配器,获得已配对的设备,从设备中找到要连接的设备建立连接并获取输入流。
以下为java的代码,布局文件先不贴了

public class Library extends Activity {
    private BluetoothAdapter mBtAdapter;
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    private Button bt_dk;
    private TextView rl_error;
    InputStream inStream = null;    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_library);
    bt_dk = (Button) findViewById(R.id.bt_dk);
    rl_error = (TextView) findViewById(R.id.rl_error);
    //取得蓝牙适配器
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBtAdapter != null) {
        if (!mBtAdapter.isEnabled()) {
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivity(intent);
        }
    }
    // 获得已经配对的设备
    Set pairedDevices = mBtAdapter.getBondedDevices();
    BluetoothSocket socket = null;
    if (pairedDevices.size() > 0) {
        for (BluetoothDevice device : pairedDevices) {
        // 从已经配对的设备中找到要连接的设备,在测试时将hello改成自己的蓝牙模块的名字
            if ("hello".equals(device.getName())) {
                rl_error.append(device.getName() + "\n" + device.getAddress() + "\n");
                try {
                //和已经配对的要连接的设备建立连接
                    socket = device.createRfcommSocketToServiceRecord(MY_UUID);
                    socket.connect();
                } catch (IOException e) {
                    rl_error.append("创建或连接异常!\n");
                    if (socket != null) {
                        try {
                            socket.close();
                        } catch (IOException e1) {
                            rl_error.append("关闭异常!\n");
                        }
                    }
                }
                rl_error.append("创建成功!\n");
                try {
                    // 获取输入
                    inStream = socket.getInputStream();
                } catch (IOException e) {
                    rl_error.append("获取流异常!\n");
                }
                rl_error.append("获取流成功!\n");
            }
        }
    }
    bt_dk.setOnClickListener(new View.OnClickListener() {//点击读卡按钮,对获取的流进行读操作
        @Override
        public void onClick(View v) {
            StringBuffer str=new StringBuffer();
            try{
                for(int i=1;i<=13;i++) {
                     str.append("" + (char) (inStream.read()));//不断的读并转化为char型
                }
                int begin=(str.toString()).indexOf("+");//这里就是对下位机的标志的使用
                int end=(str.toString()).indexOf(".",begin);
                String newStr=str.substring(begin+1,end);//得到一串正确的卡号
                 rl_et.setText(newStr);
            }
            catch (IOException e) {
               rl_error.append("传输失败!\n");
            }
       }
    });	
  1. 读到的卡号进行数据库操作,数据库中有三张表,book:book_id(text),book_name(text),book_author(text),book_public(text),book_date(Date);
    user:user_id(text),user_name(text),money(double);lend:user_id(text),book_id(text),book_jdate(date),book_hdate(date);读到的卡号可以代表读者进行注册,也就是把卡号和读者姓名放进数据库中的user表里。
class MyHelper extends SQLiteOpenHelper{//创建该类用以数据库的创建
   public MyHelper(Context context){
       super(context,"mydb.db",null,1);
   }

   @Override
   public void onCreate(SQLiteDatabase db) {//在创建库的时候第一次调用,而后不再调用
       db.execSQL("CREATE TABLE user(user_id varchar(30) primary key autoincrement,user_name varchar(20))");
       db.execSQL("CREATE TABLE book(book_id text primary key autoincrement,book_name text,book_author text,book_date Date,book_public text)");
       db.execSQL("CREATE TABLE lend(book_id text,user_id text,book_jdate Date,book_hdate Date)");
   }
   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
   }
}    
//在代码中使用MyHelper myhelper=new MyHelper();即表示创建了数据库的其三张表,以后可利用myhelper的相关操作进行数据库的打开
//这是数据库的插入操作
SQLiteDatabase db=myhelper.getWritableDatabase();
ContentValues values=new ContentValues();//用来放插入值得values对象
values.put("user_id",id);//i为卡号字符串,user_id是要插入的列的名
values.put("user_name",name);
values.put("money",new Double(10));
db.insert("user",null,values);
Toast.makeText(registerLibrary.this,"信息添加成功",Toast.LENGTH_LONG).show();
db.close();
//也可以使用execSQL("insert into user values(id,name,10.00)");这样使用SQL语句也比较方便
//查询操作
public int find(String id,String name){
       int result=0;
       SQLiteDatabase db=myhelper.getReadableDatabase();
       Cursor cursor=db.query("user",null,"user_name=?",new String[]{name},
               null,null,null);
       if(cursor.moveToNext()){
           result=1;//表示在user表中查到了user_name=name的一条记录
       }
       cursor=db.query("user",null,"user_id=?",new String[]{id},
                null,null,null);
       if(cursor.moveToNext()){
            result=2;//表示在user表中查到了user_id=id的一条记录      
        }    
       cursor.close();
       db.close();
       return result;
   }
}
//删除操作
SQLiteDatabase db=myhelper.getReadableDatabase();
db.delete("lend","user_id=? and book_id=?",new String[]{uid,newStr});
db.close();
//修改操作,建立于查操作之上
cur=db.query("user",null,"user_id=?",new String[]{uid},
       null,null,null);
cur.moveToFirst();
double mon=cur.getDouble(2);//要修改的列是第三列money,注意下标从0开始
ContentValues values=new ContentValues();
values.put("money",new Double(mon-0.1*Math.abs(days)));
db.update("user",values,"user_id=?",new String[]{uid});

接下来数据库的查看,我使用的是SQLiteStudio,它需要一些配置,不过很简单了,百度一你就知道了,打开后一定要运行着手机上的软件,或者虚拟机的软件,这样才能查看数据库,很方便的,也可以修改等等。
SQLiteStudio的安装配置: https://blog.csdn.net/ware00/article/details/80595496.
代码我会等下上传到码云并给出链接,有很多不足的地方还需要改进,欢迎大家指点。
上位机和下位机的链接:https://gitee.com/w9z7/codes

你可能感兴趣的:(课设)