我正在编写一个应用程序来从我的 Android 手机(GPS 位置、加速度计、方向)获取传感器数据,并通过 UDP 将数据发送到服务器(顺便说一下,我计划为此使用 Python)。
现在,我已经设法获取传感器数据并显示它们,但有点卡在想办法将各种传感器数据组合成一个数据包,并通过 UDP 发送数据包。我不知道如何“合并”数据,使其仍然可以被服务器识别,例如它来自加速器,或者它是 GPS 坐标等。
有什么建议么?
如果您在服务器端使用 Python,您可以将值打包成 JSON 字符串,例如 { "sensor": somedata, "gps": somedata }
(因为使用json.loads将 JSON 对象反序列化为字典非常容易)
然后将此字符串放入UDP数据包
要创建 JSON 字符串,您可以使用这些类http://developer.android.com/reference/org/json/package-summary.html
JSON 很好,或者您可以使用 Jython 让您利用 Java 的序列化库。这样做的好处是您不必做任何工作来将您的类转换为可序列化的格式,实际上只需实现可序列化并添加一个 serialVersionUID。
复制自Jython 提示:
9 序列化
Java 对象不能使用标准的 Python pickle 和 cPickle 模块进行序列化。Java 和 Jython 对象都可以使用普通的 Java 序列化进行序列化。但是,在反序列化 Jython 对象时,您不能使用普通的 java.io.ObjectInputStream 类,您必须使用 Jython 特定的 org.python.util.PythonObjectInputStream,如下所示:
import java.io as io
import org.python.util as util
class TestClass(io.Serializable):
def __init_ _(self, value=0):
self.value = value
self.message = "Serialized"
def toString(self):
return "Message: %(message)s value:
is %(value)s" % self.__dict_ _
instance = TestClass(3)
outFile = io.FileOutputStream("test.ser")
outStream = io.ObjectOutputStream(outFile)
outStream.writeObject(instance)
outFile.close( )
inFile = io.FileInputStream("test.ser")
inStream = util.PythonObjectInputStream(inFile)
readInstance = inStream.readObject( )
print readInstance.toString( )
Message: Serialized value: is 3
如果不使用 PythonObjectInputStream,则会出现运行时错误,因为普通的 Java ObjectInputStream 很难找到和重新创建用于 Jython 的 Java 继承的动态加载的代理类。